home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Die Speccy' 97
/
Die Speccy' 97.iso
/
amiga_system
/
the_aminet
/
comm
/
bbs
/
bbbbs85.lha
/
rexx
/
BuildALPHA.rexx
< prev
next >
Wrap
OS/2 REXX Batch file
|
1995-06-05
|
14KB
|
538 lines
/* $VER: BuildALPHA.rexx 8.5 (5.6.95)
copyright 1990-95 Richard Lee Stockton
FREELY DISTRIBUTABLE
Build the main filelist "Lists/Files", and alphabetically
sorted filelist "Lists/Files.ALPHA" from the filenotes.
KeyWords field (if empty) is built from the long description (if any).
Bytes field is corrected (if necessary) to match real filesize.
If COLLECT is passed as an argument, will collect files that have
no file description and construct descriptions for them using the
filecomment of the file (if any) for note data. Note that the
filecomment may then be blanked so it won't interfere with displays.
If NOFILEBUILD is passed as an argument, only the alpha list is built.
You may NOT use both flags at once.
*/
IF ~SHOW('P','QuickSortPort') THEN CALL setup.rexx()
IF ~SHOW('P','QuickSortPort') THEN CALL GETOUT(666)
ARG baflags .
IF baflags='?' THEN
DO
DO i=1 TO 14
SAY SOURCELINE(i)
END
EXIT
END
CALL OPENPORT('BUILDALPHA')
figarg='s:CONFIG.BBS'
IF ~EXISTS(figarg) THEN figarg='BBS:BBS_TEXT/CONFIG.BBS'
x=OPEN(f,figarg,'R')
IF x=0 THEN
DO
SAY 's:CONFIG.BBS and BBS:BBS/CONFIG.BBS are both missing!'
EXIT(20)
END
lynes.=''
DO i=1 TO 8
lynes.i=READLN(f)
END
CALL CLOSE(f)
compos=POS('/*',lynes.1)
IF compos>0 THEN lynes.1=LEFT(lynes.1,compos-1)
bbsname = STRIP(lynes.1)
sysop = WORD(lynes.2,1)
bbspath = WORD(lynes.6,1)
IF ~EXISTS(bbspath) THEN
DO
SAY 'The bbspath, 'bbspath', does not exist!'
EXIT(21)
END
testchar=RIGHT(bbspath,1)
IF testchar~='/' & testchar~=':' THEN bbspath=bbspath'/'
libpath = WORD(lynes.8,1)
IF ~EXISTS(libpath) THEN
DO
SAY 'The library path, 'libpath', does not exist!'
EXIT(22)
END
testchar=RIGHT(libpath,1)
IF testchar~='/' & testchar~=':' THEN libpath=libpath'/'
IF SHOW('P','BBBBS') THEN CALL PRAGMA('P',-2)
etime=TIME('R')
IF baflags='COLLECT' THEN
DO
OPTIONS PROMPT 'Shall I clear each filecomment after using in the description? (Yn) > '
PULL clearflag .
clearflag=LEFT(STRIP(clearflag),1)
SAY 'Searching for files with no file descriptions...'
filelibs=SHOWDIR(libpath,'D')
DO i=1 TO WORDS(filelibs)
thislib=WORD(filelibs,i)
realfiles=SHOWDIR(libpath||thislib)
DO j=1 TO WORDS(realfiles)
thisfile=WORD(realfiles,j)
IF ~EXISTS(bbspath'FileNotes/'thislib'/'thisfile) THEN CALL makenote
END
END
IF ~DATATYPE(lastfile,'N') THEN
DO
SAY 'All files in the libraries have descriptions.'
EXIT
END
END
x=OPEN(f,bbspath'Lists/Libraries','R')
IF x=0 THEN CALL GETOUT(24);
libs.=''
DO i=1
line=READLN(f)
IF EOF(f) THEN LEAVE i
indx=WORD(line,1)
IF ~DATATYPE(indx,'W') THEN ITERATE i
libs.indx=WORD(line,2)
END
CALL CLOSE(f)
f.=''
cnt.=0
latest=0
IF ~listOPEN(a,bbspath'Lists/Files.ALPHA.alpha','W') THEN CALL GETOUT(26)
IF baflags='NOFILEBUILD' THEN SAY 'Rebuilding Files.ALPHA...'
ELSE SAY 'Rebuilding Filelists...'
DO i=1 TO 99
IF libs.i='' THEN ITERATE i
CALL MAKEDIR(libpath||libs.i)
notes=SHOWDIR(bbspath'FileNotes/'libs.i,'F')
DO j=1 TO WORDS(notes)
note=WORD(notes,j)
file=libpath||libs.i'/'note
IF ~EXISTS(file) THEN
DO
temp=WORD(STATEF(bbspath'FileNotes/'libs.i'/'note),8)
IF temp~='' THEN file=temp
IF ~EXISTS(file) THEN SAY file 'does not exist.'
END
IF OPEN(f,bbspath'FileNotes/'libs.i'/'note,'R')=0 THEN
DO
CALL CLOSE(f)
IF EXISTS(file) THEN
SAY 'Could not open file description for' libs.i'/'note
ELSE SAY file 'does not exist.'
ITERATE j
END
line=READLN(f)
PARSE VAR line 'File:' filenum 'KeyWords:' keywords
IF ~DATATYPE(filenum,'W') THEN
DO
CALL CLOSE(f)
SAY '*** Bad file description!' libs.i'/'note
SAY line
ITERATE j
END
filenum=filenum%1
line=READLN(f)
name=WORD(line,2)
notebytes=WORD(line,4)
IF LENGTH(keywords)<3 THEN
DO
CALL READLN(f)
CALL READLN(f)
line=READLN(f)
CALL CLOSE(f)
IF line~='' THEN
DO
keywords=STRIP(LEFT(line,32))
CALL fixkeywords()
END
END
ELSE CALL CLOSE(f)
IF POS('1B'x,keywords)>0 THEN
DO
keywords=strip_ansi(keywords)
CALL fixkeywords()
END
bytes=0
IF EXISTS(file) THEN
DO
bytes=WORD(STATEF(file),2)
IF bytes~=notebytes THEN CALL fixbytes()
END
ELSE bytes=notebytes
IF UPPER(name)~=UPPER(note) THEN CALL fixname()
IF f.filenum~='' THEN
DO
SAY 'Duplicate file numbers! 'filenum f.filenum '&' libs.i name
IF OPEN(na,bbspath'Numbers/LastFile','R')~=0 THEN
DO
newnum=READLN(na)
CALL CLOSE(na)
IF DATATYPE(newnum,'W') THEN
DO
filenum=newnum+1
CALL fixnumber()
IF baflags='NOFILEBUILD' THEN
DO
IF OPEN(na,bbspath'BBS_TEXT/Files','A')~=0 THEN
DO
CALL WRITELN(na,filenum libs.i note)
CALL CLOSE(na)
END
END
IF OPEN(na,bbspath'Numbers/LastFile','W')~=0 THEN
DO
CALL WRITELN(na,filenum)
CALL CLOSE(na)
END
END
END
END
IF baflags~='NOFILEBUILD' THEN f.filenum=libs.i name
IF filenum>latest THEN latest=filenum
alpha=LEFT(name,22-LENGTH(bytes)) bytes RIGHT(filenum,5) RIGHT(i,2)
alpha=alpha LEFT(libs.i,12) TRIM(LEFT(STRIP(keywords),32))
CALL WRITELN(a,alpha)
cnt.i=cnt.i+1
END
lf1=libpath||libs.i'/.'STRIP(LEFT(libs.i,15))
CALL DELETE(lf1)
flg='W'
IF EXISTS(libpath||libs.i'.txt') THEN
DO
ADDRESS COMMAND 'COPY' libpath||libs.i'.txt' lf1
flg='A'
END
IF listOPEN(f,lf1,flg)=0 THEN ITERATE j
IF flg='A' THEN CALL WRITELN(f,'')
CALL WRITELN(f,'Filename Bytes File# Library KeyWords')
CALL WRITELN(f,LEFT('=',77,'='))
CALL CLOSE(f)
END
CALL CLOSE(a)
CALL SETCLIP('BBS_UPLOAD','NO')
IF baflags~='NOFILEBUILD' THEN
DO
IF ~listOPEN(f,bbspath'Lists/Files','W') THEN CALL GETOUT(27)
CALL SETCLIP('BBS_UPLOAD','NO')
SAY 'Saving Lists/Files...'
DO i=1 TO latest
IF f.i='' THEN ITERATE i
CALL WRITELN(f,i f.i)
END
CALL CLOSE(f)
END
IF EXISTS('c:shellsort') THEN
DO
SAY 'Sorting...'
temp=bbspath'Lists/Files.ALPHA.alpha'
temp='c:shellsort -c' temp temp
ADDRESS COMMAND temp
CALL DELAY(28)
END
a.=''
IF ~listOPEN(f,bbspath'Lists/Files.ALPHA.alpha','R') THEN CALL GETOUT(28)
SAY 'Loading Lists/Files.ALPHA.alpha...'
DO i=1
line=READLN(f)
IF EOF(f) THEN LEAVE i
a.i=line
END
CALL CLOSE(f)
a.0=i-1
IF ~EXISTS('c:shellsort') THEN
DO
SAY 'Sorting...'
CALL QSORT(1,a.0,a)
END
IF ~listOPEN(f,bbspath'Lists/Files.ALPHA','W') THEN CALL GETOUT(29)
CALL DELETE(bbspath'Lists/Files.ALPHA.alpha')
SAY 'Saving Lists/Files.ALPHA and individual library lists...'
DO i=1 TO a.0
IF a.i='' THEN ITERATE i
CALL WRITELN(f,a.i)
lnum=WORD(a.i,4)
IF ~DATATYPE(lnum,'W') THEN ITERATE i
flg='W'
lf=libpath||libs.lnum'/.'STRIP(LEFT(libs.lnum,15))
IF EXISTS(lf) THEN flg='A'
IF ~OPEN(a,lf,flg) THEN ITERATE i
CALL WRITELN(a,a.i)
CALL CLOSE(a)
END
CALL CLOSE(f)
CALL SETCLIP('BBS_UPLOAD')
SAY 'Adding taglines to individual lists...'
DO tt=1 TO 99
IF libs.tt='' THEN ITERATE tt
dname='.'STRIP(LEFT(libs.tt,15))
x=OPEN(f,libpath||libs.tt'/'dname,'A')
IF x~=0 THEN
DO
CALL WRITELN(f,LEFT('-',77,'-'))
temp='file'
IF cnt.tt~=1 THEN temp=temp's'
temp=cnt.tt temp'. Last updated' DATE() 'at' TIME('C')
temp=temp RIGHT(bbsname,76-LENGTH(temp))
CALL WRITELN(f,temp)
CALL CLOSE(f)
END
CALL MAKEDIR(bbspath'FileNotes/'libs.tt)
fnote=bbspath'FileNotes/'libs.tt'/'dname
lynes.=''
lynes.0=5
x=OPEN(f,fnote,'R')
IF x~=0 THEN
DO
DO k=1
line=READLN(f)
IF EOF(f) THEN LEAVE k
lynes.k=line
END
CALL CLOSE(f)
lynes.0=k-1
END
finfo=STATEF(libpath||libs.tt'/.'STRIP(LEFT(libs.tt,15)))
bt=WORD(finfo,2)
dl=WORD(lynes.2,7)
IF ~DATATYPE(dl,'W') THEN dl=0
lynes.1='File: 'LEFT(tt,5)' KeyWords: alphabetical files list CONTENTS'
lynes.2='Name: 'LEFT(dname,27)' Size:' bt 'bytes Downloads:' dl
lynes.3='From: 'LEFT('BBBBS',27)' Date: 'DATE() TIME('C')' Lib: 'libs.tt
lynes.4=LEFT('',74,'=')
IF lynes.5='' THEN
lynes.5='Up to the minute alphabetical filelist of the' libs.tt 'library.'
IF OPEN(f,fnote,'W')~=0 THEN
DO
DO k=1 TO lynes.0
CALL WRITELN(f,lynes.k)
END
CALL CLOSE(f)
END
END
IF SHOW('P','BBBBS') THEN CALL SETCLIP('BBS_localfiles',2)
IF SHOW('P','BBBBS_LOCAL') THEN CALL SETCLIP('BBS_mainfiles',2)
CALL GETOUT(0)
EXIT
/* sub-routines */
GETOUT:
ARG outnum .
IF outnum>0 THEN SAY 'Error number' outnum'. Refer to BuildALPHA.rexx'
mins=TIME('E')%60
secs=TRUNC(TIME('E')//60)
IF secs<10 THEN secs='0'secs
SAY 'Elapsed time file building =' mins':'secs
CALL SETCLIP('BBS_UPLOAD')
EXIT(outnum);
strip_ansi:
PARSE ARG aline
n=POS('1B'x,aline)
DO WHILE n>0
DO k=2
IF DATATYPE(SUBSTR(aline,n+k,1),'M') | (n+k+1)>LENGTH(aline) THEN
leave k
END
aline=DELSTR(aline,n,k+1)
n=POS('1B'x,aline)
END
RETURN aline
fixnumber:
SAY 'Adding' libs.i name 'to the filelists as file number' filenum'...'
x=OPEN(f,bbspath'FileNotes/'libs.i'/'note,'R')
IF x=0 THEN
DO
SAY note 'failed to open for reading! (fixing filenumber)'
RETURN
END
text.=''
DO ii=1
x=READLN(F)
IF EOF(f) THEN LEAVE ii
text.ii=x
END
CALL CLOSE(f)
text.0=ii-1
text.1=OVERLAY(filenum,text.1,7,5)
CALL DELAY(50)
x=OPEN(f,bbspath'FileNotes/'libs.i'/'note,'W')
IF x=0 THEN
DO
SAY note 'failed to open for writing! (fixing filenumber)'
RETURN
END
DO ii=1 TO text.0
CALL WRITELN(f,text.ii)
END
CALL CLOSE(f)
RETURN
fixname:
SAY 'Name: field does not match actual filename!'
SAY 'Changing Name: 'name' in file description to 'note
x=OPEN(f,bbspath'FileNotes/'libs.i'/'note,'R')
IF x=0 THEN
DO
SAY note 'failed to open for reading! (fixing name)'
RETURN
END
text.=''
DO ii=1
x=READLN(F)
IF EOF(f) THEN LEAVE ii
text.ii=x
END
CALL CLOSE(f)
text.0=ii-1
text.2=OVERLAY(note,text.2,7,27)
CALL DELAY(50)
x=OPEN(f,bbspath'FileNotes/'libs.i'/'note,'W')
IF x=0 THEN
DO
SAY note 'failed to open for writing! (fixing name)'
RETURN
END
DO ii=1 TO text.0
CALL WRITELN(f,text.ii)
END
CALL CLOSE(f)
name=note
RETURN
fixkeywords:
SAY 'Fixing keywords field for' libs.i'/'note
fixfile=bbspath'FileNotes/'libs.i'/'note
finfo=STATEF(fixfile)
comment=''
IF WORDS(finfo)>7 THEN comment=STRIP(SUBSTR(finfo,WORDINDEX(finfo,8)))
fxlines.=''
x=OPEN(kf,fixfile,'R')
IF x=0 THEN
DO
SAY 'Failed to open' fixfile 'for reading! (keywords adjustment)'
RETURN
END
DO fx=1
line=READLN(kf)
IF EOF(kf) THEN LEAVE fx
fxlines.fx=line
END
CALL CLOSE(kf)
fxlines.0=fx-1
fxlines.1='File:' LEFT(WORD(fxlines.1,2),5) 'KeyWords:' keywords
x=OPEN(kf,fixfile,'W')
IF x=0 THEN
DO
SAY 'Failed to open' fixfile 'for writing! (keywords adjustment)'
RETURN
END
DO fx=1 TO fxlines.0
CALL WRITELN(kf,fxlines.fx)
END
CALL CLOSE(kf)
IF comment~='' THEN ADDRESS COMMAND 'filenote' fixfile comment
RETURN
fixbytes:
SAY 'Fixing bytes field for' libs.i'/'note
fixfile=bbspath'FileNotes/'libs.i'/'note
finfo=STATEF(fixfile)
comment=''
IF WORDS(finfo)>7 THEN comment=STRIP(SUBSTR(finfo,WORDINDEX(finfo,8)))
fxlines.=''
x=OPEN(f,fixfile,'R')
IF x=0 THEN
DO
SAY 'Failed to open' fixfile 'for reading! (byte adjustment)'
RETURN
END
DO fx=1
line=READLN(f)
IF EOF(f) THEN LEAVE fx
fxlines.fx=line
END
CALL CLOSE(f)
fxlines.0=fx-1
fxlines.2=OVERLAY(bytes,fxlines.2,WORDINDEX(fxlines.2,4),LENGTH(bytes)+1)
x=OPEN(f,fixfile,'W')
IF x=0 THEN
DO
SAY 'Failed to open' fixfile 'for writing! (byte adjustment)'
RETURN
END
DO fx=1 TO fxlines.0
CALL WRITELN(f,fxlines.fx)
END
CALL CLOSE(f)
IF comment~='' THEN ADDRESS COMMAND 'filenote' fixfile comment
RETURN
makenote:
CALL MAKEDIR(bbspath'FileNotes/'thislib)
x=OPEN(f,bbspath'FileNotes/'thislib'/'thisfile,'W')
IF x=0 THEN
DO
SAY bbspath'FileNotes/'thislib'/'thisfile 'failed to open for writing!'
RETURN
END
x=OPEN(ff,bbspath'Numbers/LastFile','R')
IF x~=0 THEN lastfile=READLN(ff)+1
ELSE lastfile=1
CALL CLOSE(ff)
ADDRESS COMMAND 'ECHO >'bbspath'Numbers/LastFile 'lastfile
finfo=STATEF(libpath||thislib'/'thisfile)
bytes=WORD(finfo,2)
comment=''
IF WORDS(finfo)>7 THEN comment=STRIP(SUBSTR(finfo,WORDINDEX(finfo,8)))
CALL WRITELN(f,'File: 'LEFT(lastfile,5)' KeyWords:' STRIP(LEFT(comment,32)))
CALL WRITELN(f,'Name: 'LEFT(thisfile,27)' Size: 'bytes' bytes Downloads: 0')
CALL WRITELN(f,'From: 'LEFT(sysop,27)' Date: 'DATE() TIME('C')' Lib: 'thislib)
CALL WRITELN(f,LEFT('',74,'='))
IF LENGTH(comment)>31 THEN CALL WRITELN(f,comment)
CALL CLOSE(f)
IF comment~='' & clearflag~='N' THEN
ADDRESS COMMAND 'filenote' libpath||thislib'/'thisfile '22'x||'22'x
SAY 'Added' thisfile 'to the' thislib 'library.'
RETURN
listOPEN:
PARSE ARG fh,listfile,flag
DO li=0 TO 59 WHILE OPEN(fh,listfile,flag)=0
IF li//4=0 THEN SAY 'Waiting' (60-li)*5 'more seconds for' listfile 'to become available...'
CALL DELAY(250)
END
IF li>59 THEN
DO
SAY '*** unable to access' listfile 'list.'
RETURN 0
END
RETURN 1
/* BuildALPHA.rexx */